package com.haidechizi.designpattern.template.hook;

/**
 * @author haidechizi
 */
public abstract class AbstractWashCloth implements WashCloth {

    /**
     * 洗衣服
     */
    @Override
    public final void wash() {
        addWater();
        if (needSoak()) {
            soak();
        }
        doWash();
        spinDry();
    }

    /**
     * 钩子方法，通过此方法，可以兼容模板步骤有细微差异的操作
     * 默认返回false，子类可以覆盖方法
     * @return
     */
    protected boolean needSoak() {
        return false;
    }

    /**
     * 放水
     */
    protected abstract void addWater();

    /**
     * 浸泡
     * 对于额外步骤，默认实现一个空方法，子类可以进行覆盖
     */
    protected void soak() {
        // 空方法，父类不执行操作
    }

    /**
     * 清洗
     */
    protected abstract void doWash();

    /**
     * 甩干
     */
    protected abstract void spinDry();
}
